home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / jpl_c.zip / ASIN.C < prev    next >
Text File  |  1986-05-18  |  3KB  |  103 lines

  1. /* 1.0  04-27-84 */
  2. /************************************************************************
  3.  *            Robert C. Tausworthe                *
  4.  *            Jet Propulsion Laboratory            *
  5.  *            Pasadena, CA 91009        1984        *
  6.  ************************************************************************
  7.  *    Programmmed using the algorithms given in:
  8.  *
  9.  *    Coty, William J., Jr., and Waite, William, SOFTWARE MANUAL FOR
  10.  *    THE ELEMENTARY FUNCTIONS, Prentice-Hall Series in Computational
  11.  *    Mathematics, Prentice-Hall, Inc., Inglewood Cliffs, NJ, 1980,
  12.  *    pp. 174-193.
  13.  *
  14.  *----------------------------------------------------------------------*/
  15.  
  16. #include "defs.h"
  17. #include "stdtyp.h"
  18. #include "errno.h"
  19. #include "mathtyp.h"
  20. #include "mathcons.h"
  21.  
  22. /*----------------------------------------------------------------------*/
  23.  
  24. #define P0     +1.0
  25. #define P1     -0.27368494524164255994e+2
  26. #define P2     +0.57208227877891731407e+2
  27. #define P3     -0.39688862997504877339e+2
  28. #define P4     +0.10152522233806463645e+2
  29. #define P5     -0.69674573447350646411
  30. #define P(g)     ((((P5*g P4)*g P3)*g P2)*g P1)
  31.  
  32. #define Q0     -0.16421096714498560795e+3
  33. #define Q1     +0.41714430248260412556e+3
  34. #define Q2     -0.38186303361750149284e+3
  35. #define Q3     +0.15095270841030604719e+3
  36. #define Q4     -0.23823859153670238830e+2
  37. #define Q(g)     (((((g Q4)*g Q3)*g Q2)*g Q1)*g Q0)
  38.  
  39. LOCAL double asincos();
  40.  
  41. /************************************************************************/
  42.     double
  43. asin(x)            /* return the trigonometric arc-sine of x    */
  44.  
  45. /*----------------------------------------------------------------------*/
  46. double x;
  47. {
  48.     return asincos(x, 0);
  49. }
  50.  
  51. /*\p*********************************************************************/
  52.  
  53. double acos(x)        /* return the trigonometric arc-cosine of x    */
  54.  
  55. /*----------------------------------------------------------------------*/
  56. double x;
  57. {
  58.     return asincos(x, 1);
  59. }
  60.  
  61. /************************************************************************/
  62.     LOCAL double
  63. asincos(x, flg)        /* return arc sin or cos, depending on flg    */
  64.  
  65. /*----------------------------------------------------------------------*/
  66. double x;
  67. {
  68.     double y, g, r;
  69.     FAST int i;
  70.     LOCAL double a[2] = { 0.0, PIover4};
  71.     LOCAL double b[2] = { PIover2, PIover4};
  72.  
  73.     y = ABS(x);
  74.     i = flg;
  75.     if (y < FADEOUT)
  76.         r = y;
  77.     else
  78.     {    if (y > 0.5)
  79.         {    i = 1 - i;
  80.             if (y > 1.0)
  81.             {    errno = EDOM;
  82.                 return 0.0;
  83.             }
  84.             g = ldexp((0.5 - y) + 0.5, -1);
  85.             y = -ldexp(sqrt(g), 1);
  86.         } else
  87.             g = y * y;
  88.         r = y + y *
  89.             ((P(g) * g)
  90.             / Q(g));
  91.     }
  92.     if (flg)
  93.     {    if (x < 0.0)
  94.             r = (b[i] + r) + b[i];
  95.         else
  96.             r = (a[i] - r) + a[i];
  97.     }
  98.     else
  99.         r = (a[i] + r) + a[i];
  100.     return (x < 0.0 ? -r : r);
  101. }
  102.  
  103.